const express = require('express');
const { body } = require('express-validator');
const orderController = require('../controllers/orderController');
const { protect, restrictTo, optionalAuth } = require('../middleware/auth');
const rateLimit = require('express-rate-limit');

const router = express.Router();

// 限制订单操作请求的频率
const orderLimiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15分钟
  max: 50, // 限制每个IP 15分钟内最多50次请求
  message: {
    status: 'error',
    message: '请求过于频繁，请稍后再试'
  },
  standardHeaders: true,
  legacyHeaders: false
});

// 限制订单创建请求的频率
const createOrderLimiter = rateLimit({
  windowMs: 60 * 60 * 1000, // 1小时
  max: 10, // 限制每个IP 1小时内最多10次订单创建请求
  message: {
    status: 'error',
    message: '订单创建过于频繁，请1小时后再试'
  },
  standardHeaders: true,
  legacyHeaders: false
});

// 验证规则
const createOrderValidation = [
  body('pets')
    .isArray({ min: 1 })
    .withMessage('至少需要选择一只宠物')
    .custom((value) => {
      if (!value.every(id => typeof id === 'string' && id.length === 24)) {
        throw new Error('宠物ID格式无效');
      }
      return true;
    }),
  
  body('service')
    .isMongoId()
    .withMessage('服务ID无效'),
  
  body('caregiver')
    .isMongoId()
    .withMessage('护理员ID无效'),
  
  body('startDateTime')
    .isISO8601()
    .withMessage('请提供有效的开始时间')
    .custom((value) => {
      const startDate = new Date(value);
      const now = new Date();
      if (startDate <= now) {
        throw new Error('开始时间必须是未来时间');
      }
      return true;
    }),
  
  body('endDateTime')
    .isISO8601()
    .withMessage('请提供有效的结束时间')
    .custom((value, { req }) => {
      const endDate = new Date(value);
      const startDate = new Date(req.body.startDateTime);
      if (endDate <= startDate) {
        throw new Error('结束时间必须晚于开始时间');
      }
      // 检查服务时长是否合理（最少30分钟，最多24小时）
      const duration = (endDate - startDate) / (1000 * 60); // 分钟
      if (duration < 30 || duration > 24 * 60) {
        throw new Error('服务时长必须在30分钟到24小时之间');
      }
      return true;
    }),
  
  body('address.street')
    .isLength({ min: 1, max: 200 })
    .withMessage('街道地址长度必须在1-200个字符之间'),
  
  body('address.city')
    .isLength({ min: 1, max: 100 })
    .withMessage('城市名称长度必须在1-100个字符之间'),
  
  body('address.coordinates')
    .optional()
    .isArray({ min: 2, max: 2 })
    .withMessage('坐标必须是包含经度和纬度的数组'),
  
  body('specialInstructions')
    .optional()
    .isLength({ max: 1000 })
    .withMessage('特殊说明不能超过1000个字符'),
  
  body('isRecurring')
    .optional()
    .isBoolean()
    .withMessage('重复服务标志必须是布尔值'),
  
  body('recurringPattern.frequency')
    .if(body('isRecurring').equals(true))
    .isIn(['daily', 'weekly', 'monthly'])
    .withMessage('重复频率必须是 daily、weekly 或 monthly'),
  
  body('recurringPattern.endDate')
    .if(body('isRecurring').equals(true))
    .isISO8601()
    .withMessage('重复结束日期格式无效')
];

const updateStatusValidation = [
  body('status')
    .isIn(['pending', 'confirmed', 'in_progress', 'completed', 'cancelled'])
    .withMessage('状态必须是 pending、confirmed、in_progress、completed 或 cancelled'),
  
  body('reason')
    .optional()
    .isLength({ min: 1, max: 500 })
    .withMessage('原因说明长度必须在1-500个字符之间')
];

const cancelOrderValidation = [
  body('reason')
    .isLength({ min: 1, max: 500 })
    .withMessage('取消原因长度必须在1-500个字符之间')
];

const serviceReportValidation = [
  body('report.activities')
    .isArray()
    .withMessage('活动记录必须是数组'),
  
  body('report.petCondition')
    .isLength({ min: 1, max: 1000 })
    .withMessage('宠物状况描述长度必须在1-1000个字符之间'),
  
  body('report.issues')
    .optional()
    .isArray()
    .withMessage('问题记录必须是数组'),
  
  body('report.caregiverNotes')
    .optional()
    .isLength({ max: 1000 })
    .withMessage('护理员备注不能超过1000个字符'),
  
  body('report.photos')
    .optional()
    .isArray()
    .withMessage('照片列表必须是数组')
];

const reviewValidation = [
  body('rating')
    .isInt({ min: 1, max: 5 })
    .withMessage('评分必须是1-5之间的整数'),
  
  body('comment')
    .optional()
    .isLength({ max: 500 })
    .withMessage('评价内容不能超过500个字符'),
  
  body('reviewType')
    .isIn(['customer', 'caregiver'])
    .withMessage('评价类型必须是 customer 或 caregiver')
];

// 应用限流中间件
router.use(orderLimiter);

// 公开路由（可选认证）
/**
 * @route   GET /api/orders/available
 * @desc    获取可接的订单列表
 * @access  Public
 */
router.get('/available', optionalAuth, orderController.getAvailableOrders);

// 需要认证的路由
router.use(protect);

// 用户订单操作

/**
 * @route   GET /api/orders/my-orders
 * @desc    获取当前用户的所有订单
 * @access  Private
 */
router.get('/my-orders', orderController.getMyOrders);

/**
 * @route   GET /api/orders/caregiver-orders
 * @desc    获取护理员的所有订单
 * @access  Private/Caregiver
 */
router.get('/caregiver-orders', restrictTo('caregiver', 'admin'), orderController.getCaregiverOrders);

/**
 * @route   POST /api/orders
 * @desc    创建新订单
 * @access  Private
 */
router.post('/', createOrderLimiter, createOrderValidation, orderController.createOrder);

/**
 * @route   GET /api/orders/stats
 * @desc    获取订单统计信息
 * @access  Private/Admin
 */
router.get('/stats', restrictTo('admin'), orderController.getOrderStats);

/**
 * @route   GET /api/orders
 * @desc    获取所有订单（管理员功能）
 * @access  Private/Admin
 */
router.get('/', restrictTo('admin'), orderController.getAllOrders);

/**
 * @route   GET /api/orders/:id
 * @desc    获取单个订单信息
 * @access  Private
 */
router.get('/:id', orderController.getOrder);

/**
 * @route   PATCH /api/orders/:id/status
 * @desc    更新订单状态
 * @access  Private
 */
router.patch('/:id/status', updateStatusValidation, orderController.updateOrderStatus);

/**
 * @route   PATCH /api/orders/:id/cancel
 * @desc    取消订单
 * @access  Private
 */
router.patch('/:id/cancel', cancelOrderValidation, orderController.cancelOrder);

/**
 * @route   PATCH /api/orders/:id/start
 * @desc    开始服务
 * @access  Private/Caregiver
 */
router.patch('/:id/start', restrictTo('caregiver', 'admin'), orderController.startService);

/**
 * @route   PATCH /api/orders/:id/complete
 * @desc    完成服务
 * @access  Private/Caregiver
 */
router.patch('/:id/complete', restrictTo('caregiver', 'admin'), serviceReportValidation, orderController.completeService);

/**
 * @route   POST /api/orders/:id/review
 * @desc    添加评价
 * @access  Private
 */
router.post('/:id/review', reviewValidation, orderController.addReview);

module.exports = router;